package com.jsbs.iam.job.dyncjob.task.base;


import com.jsbs.iam.common.core.dto.Result;
import com.jsbs.iam.common.core.dyncjob.entity.DyncJob;
import com.jsbs.iam.job.dyncjob.factory.DyncJobFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import com.jsbs.iam.common.core.utils.ExceptionUtil;

import java.time.LocalDateTime;

public abstract class BaseTask {

    private static final Logger LOGGER = LoggerFactory.getLogger(BaseTask.class);

    @Autowired
    private DyncJobFactory dyncJobFactory;

    /**
     * 执行任务
     * @return
     */
    public Result doTask(DyncJob dyncJob){
        try{
            Result ret = doTask(dyncJob.getRefData());
            return ret;
        }catch (RuntimeException e){
            LOGGER.error(String.format("JOB:%s 执行失败", dyncJob.getJobName()), e);
            return Result.failWithMsg(ExceptionUtil.getDetail(e));
        }
    }

    /**
     * 总共可以执行的次数，子类可覆盖该方法
     * @return
     */
    public int getTotalExecTimes(){
        return 3;
    }

    /**
     * 下次要执行的时间，子类可覆盖该方法
     * @param dyncJob
     * @return
     */
    public LocalDateTime getNextExecTime(DyncJob dyncJob){
        int execTimes = dyncJob.getExecTimes();
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime nextTime = now.plusSeconds((execTimes + 1) * 5);
        return nextTime;
    }

    /**
     * 继承类实现该方法
     * 注意：不要使用多线程，也不要使用异步
     * @param param
     * @return
     */
    protected abstract Result doTask(String param);

    protected void register(String jobName){
        dyncJobFactory.register(jobName, this);
    }
}
